{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://tour.golang.org/concurrency/1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Goroutines"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "import (\n",
    "    \"time\"\n",
    "    \"fmt\"\n",
    ")\n",
    "\n",
    "var s1, s2 string = \"\", \"\"\n",
    "\n",
    "func sayIt() {\n",
    "    time.Sleep(2000 * time.Millisecond)\n",
    "    s1 = \"I love you, baby.\"\n",
    "}\n",
    "\n",
    "func sayItPlease() {\n",
    "    time.Sleep(1000 * time.Millisecond)\n",
    "    s2 = \"I love you, too, bady.\"\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I love you, too, bady.\n"
     ]
    }
   ],
   "source": [
    "go sayIt()\n",
    "go sayItPlease()\n",
    "\n",
    "for s1==\"\" || s2==\"\" {\n",
    "    if s1 != \"\" {\n",
    "        fmt.Println(s1)\n",
    "        break\n",
    "    }\n",
    "    if s2 != \"\" {\n",
    "        fmt.Println(s2)\n",
    "        break\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It's amazing to see that goroutines(threading in go) could share variables between functions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Channels "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-5 17 12\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "9 <nil>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "package main\n",
    "\n",
    "import \"fmt\"\n",
    "\n",
    "func sum(s []int, c chan int) {\n",
    "    sum := 0\n",
    "    for _, v := range s {\n",
    "        sum += v\n",
    "    }\n",
    "    c <- sum // send sum to c\n",
    "}\n",
    "\n",
    "s := []int{7, 2, 8, -9, 4, 0}\n",
    "\n",
    "c := make(chan int)\n",
    "go sum(s[:len(s)/2], c)\n",
    "go sum(s[len(s)/2:], c)\n",
    "x, y := <-c, <-c // receive from c\n",
    "\n",
    "fmt.Println(x, y, x+y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Go",
   "language": "go",
   "name": "gophernotes"
  },
  "language_info": {
   "codemirror_mode": "",
   "file_extension": ".go",
   "mimetype": "",
   "name": "go",
   "nbconvert_exporter": "",
   "pygments_lexer": "",
   "version": "go1.15.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
